import { defineStore } from 'pinia'

/**
 * Pinia Store示例 - 02.定义store(选项式)
 * 
 * 这个文件展示了如何使用选项式API定义Pinia Store
 * 选项式API类似于Vue的选项式API，使用state、getters和actions对象
 */

// 商品Store - 使用选项式API
export const useProductStore = defineStore('products', {
  // state 相当于组件中的data
  state: () => ({
    // 商品列表
    items: [
      { id: 1, name: '手机', price: 3999, inventory: 10 },
      { id: 2, name: '电脑', price: 8999, inventory: 5 },
      { id: 3, name: '耳机', price: 999, inventory: 15 }
    ],
    // 是否显示库存不足商品
    showLowInventory: true
  }),

  // getters 相当于组件中的computed
  getters: {
    // 获取所有商品
    availableItems(state) {
      if (state.showLowInventory) {
        return state.items
      } else {
        return state.items.filter(item => item.inventory > 5)
      }
    },
    
    // 获取商品总数
    totalCount(state) {
      return state.items.length
    },
    
    // 获取商品总价值
    totalValue(state) {
      return state.items.reduce((total, item) => {
        return total + (item.price * item.inventory)
      }, 0)
    },
    
    // 获取指定商品 (方法形式的getter，接收参数)
    getItemById: (state) => (id) => {
      return state.items.find(item => item.id === id)
    }
  },

  // actions 相当于组件中的methods
  actions: {
    // 添加新商品
    addProduct(product) {
      // 确保商品有所有必要的字段
      if (!product.name || !product.price) {
        throw new Error('商品必须包含名称和价格')
      }
      
      // 生成新的ID (简单实现)
      const newId = Math.max(0, ...this.items.map(item => item.id)) + 1
      
      // 添加商品到列表
      this.items.push({
        id: newId,
        inventory: product.inventory || 0,
        ...product
      })
    },
    
    // 更新商品库存
    updateInventory(productId, newInventory) {
      const product = this.items.find(item => item.id === productId)
      if (product) {
        product.inventory = newInventory
      }
    },
    
    // 删除商品
    removeProduct(productId) {
      const index = this.items.findIndex(item => item.id === productId)
      if (index !== -1) {
        this.items.splice(index, 1)
      }
    },
    
    // 切换是否显示库存不足商品
    toggleLowInventoryDisplay() {
      this.showLowInventory = !this.showLowInventory
    },
    
    // 批量更新价格 (例如打折)
    applyDiscount(discountPercent) {
      this.items.forEach(item => {
        // 计算折扣后的价格并四舍五入到整数
        const discountedPrice = Math.round(item.price * (1 - discountPercent / 100))
        item.price = discountedPrice
      })
    }
  }
})

// 购物车Store - 也使用选项式API
export const useCartStore = defineStore('cart', {
  state: () => ({
    // 购物车商品，格式为: { productId, quantity }
    items: [],
  }),
  
  getters: {
    // 购物车商品总数
    totalItems(state) {
      return state.items.reduce((total, item) => total + item.quantity, 0)
    },
    
    // 购物车商品详情 (结合商品store)
    cartProducts(state) {
      // 引用商品store
      const productStore = useProductStore()
      
      return state.items.map(cartItem => {
        // 通过商品ID获取商品详情
        const product = productStore.getItemById(cartItem.productId)
        return {
          id: cartItem.productId,
          name: product.name,
          price: product.price,
          quantity: cartItem.quantity,
          total: product.price * cartItem.quantity
        }
      })
    },
    
    // 购物车总价
    cartTotalPrice(state) {
      // 使用上面定义的cartProducts getter
      return this.cartProducts.reduce((total, product) => {
        return total + product.total
      }, 0)
    }
  },
  
  actions: {
    // 添加商品到购物车
    addToCart(productId, quantity = 1) {
      const currentItem = this.items.find(item => item.productId === productId)
      
      if (currentItem) {
        // 如果商品已在购物车，增加数量
        currentItem.quantity += quantity
      } else {
        // 否则添加新商品
        this.items.push({
          productId,
          quantity
        })
      }
      
      // 可以在这里添加与商品库存的交互
      // const productStore = useProductStore()
      // productStore.updateInventory(productId, ...)
    },
    
    // 从购物车移除商品
    removeFromCart(productId) {
      const index = this.items.findIndex(item => item.productId === productId)
      if (index !== -1) {
        this.items.splice(index, 1)
      }
    },
    
    // 更新购物车商品数量
    updateCartItemQuantity(productId, quantity) {
      const item = this.items.find(item => item.productId === productId)
      if (item) {
        item.quantity = quantity
      }
    },
    
    // 清空购物车
    clearCart() {
      this.items = []
    }
  }
})
